// 给出两个 非空 的链表用来表示两个非负的整数。
// 其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
// 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
// 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
// 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
//
// 输出：7 -> 0 -> 8
//
// 原因：342 + 465 = 807
var l1 = {
    value: 2,
    next: {
        value: 4,
        next: {
            value: 3,
            next: {}
        }
    }
};

var l2 = {
    value: 5,
    next: {
        value: 6,
        next: {
            value: 4,
            next: {}
        }
    }
};

var addTwoNumbers = function (l1, l2) {
    var l1Current = l1;
    var l2Current = l2;
    var addCurrent = {
        value: 0,
    };

    var current = addCurrent;

    var computed = function (l) {
        // 如果计算的两数长度不等时则返回0
        if (l.next) {
            return l.value;
        } else {
            return 0;
        }
    };

    while (l1Current.next || l2Current.next) {
        // 计算进位
        var add = computed(l1Current) + computed(l2Current);
        if (l1Current.next) {
            l1Current = l1Current.next;
        }
        if (l2Current.next) {
            l2Current = l2Current.next;
        }
        // 计算结果添加子节点，计算进位的数，如果是最后一位则不添加子节点
        if (add >= 10) {
            current.next = {
                value: 1
            };
            add -= 10;
        } else {
            if (l1Current.next || l2Current.next) {
                current.next = {
                    value: 0
                };
            }
        }
        current.value += add;
        current = current.next;
    }

    return addCurrent;
};